From: Jan Beulich Date: Thu, 4 Aug 2016 08:08:00 +0000 (+0200) Subject: x86/time: relax barriers X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~619 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=2fd44a3edc1918c5e0eeab2d695c9a0dd2d3f506;p=xen.git x86/time: relax barriers On x86 there's no need for full barriers in loops waiting for some memory location to change. Nor do we need full barriers between two reads and two writes - SMP ones fully suffice. Signed-off-by: Jan Beulich Reviewed-by: Andrew Cooper --- diff --git a/xen/arch/x86/time.c b/xen/arch/x86/time.c index ca4e53b966..e64644031d 100644 --- a/xen/arch/x86/time.c +++ b/xen/arch/x86/time.c @@ -1211,7 +1211,7 @@ static void tsc_check_slave(void *unused) unsigned int cpu = smp_processor_id(); local_irq_disable(); while ( !cpumask_test_cpu(cpu, &tsc_check_cpumask) ) - mb(); + cpu_relax(); check_tsc_warp(cpu_khz, &tsc_max_warp); cpumask_clear_cpu(cpu, &tsc_check_cpumask); local_irq_enable(); @@ -1276,7 +1276,7 @@ static void time_calibration_tsc_rendezvous(void *_r) if ( smp_processor_id() == 0 ) { while ( atomic_read(&r->semaphore) != (total_cpus - 1) ) - mb(); + cpu_relax(); if ( r->master_stime == 0 ) { @@ -1289,21 +1289,21 @@ static void time_calibration_tsc_rendezvous(void *_r) write_tsc(r->master_tsc_stamp); while ( atomic_read(&r->semaphore) != (2*total_cpus - 1) ) - mb(); + cpu_relax(); atomic_set(&r->semaphore, 0); } else { atomic_inc(&r->semaphore); while ( atomic_read(&r->semaphore) < total_cpus ) - mb(); + cpu_relax(); if ( i == 0 ) write_tsc(r->master_tsc_stamp); atomic_inc(&r->semaphore); while ( atomic_read(&r->semaphore) > total_cpus ) - mb(); + cpu_relax(); } } @@ -1321,7 +1321,7 @@ static void time_calibration_std_rendezvous(void *_r) while ( atomic_read(&r->semaphore) != (total_cpus - 1) ) cpu_relax(); r->master_stime = read_platform_stime(); - mb(); /* write r->master_stime /then/ signal */ + smp_wmb(); /* write r->master_stime /then/ signal */ atomic_inc(&r->semaphore); } else @@ -1329,7 +1329,7 @@ static void time_calibration_std_rendezvous(void *_r) atomic_inc(&r->semaphore); while ( atomic_read(&r->semaphore) != total_cpus ) cpu_relax(); - mb(); /* receive signal /then/ read r->master_stime */ + smp_rmb(); /* receive signal /then/ read r->master_stime */ } time_calibration_rendezvous_tail(r);